package com.cans.base.service.impl;


import com.cans.base.dao.api.IBaseDao;
import com.cans.base.dto.PageRes;
import com.cans.base.model.BaseModel;
import com.cans.base.service.api.IBaseService;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 基类Service实现
 * @author cans
 * @param <T>
 * @param <ID>
 */
public abstract class BaseServiceImpl<T extends BaseModel, ID extends Serializable> implements IBaseService<T,ID> {


    @Override
    public void saveOrUpdate(T t) {
        if (t == null){
            throw new RuntimeException("操作对象不可为空");
        }
        if(null == t.getId() || "".equals(t.getId().trim())){
            // 设置创建时间
            t.setCreateTime(new Date());
        }else{
            // 设置最后修改时间
            t.setLastChangeTime(new Date());
        }

        getDaoImpl().save(t);
    }

    /**
     * 保存
     *
     * @param t
     */
    @Override
    public T save(T t){
        t.setCreateTime(new Date());
        return getDaoImpl().save(t);
    }

    /**
     * 更新
     *
     * @param t
     */
    @Override
    public T update(T t){
        if (t.getId() == null || t.getId().trim().equals("") ){
            throw new RuntimeException("ID不可为空");
        }
        t.setLastChangeTime(new Date());
        return getDaoImpl().save(t);
    }

    /**
     * 分页查询
     * @param page
     * @return
     */
    @Override
    public PageRes<T> findPage(Pageable page){
        Page<T> res = getDaoImpl().findAll(page);
        return new PageRes<T>().transfer(res);
    }

    /**
     * 带条件分页查询
     * @param var1
     * @param page
     * @return
     */
    @Override
    public PageRes<T> findAll(Specification<T> var1, Pageable page){
        Page<T> res = getDaoImpl().findAll(var1,page);
        return new PageRes<T>().transfer(res);
    }

    /**
     * 删除
     * @param t
     */
    @Override
    public void delete(T t){
        getDaoImpl().delete(t);
    }

    /**
     * 通过ID获取User
     * @param id
     * @return
     */
    public T findOne(ID id){
        T t = getDaoImpl().findOne(id);
        return t;
    }

    /**
     * 删除
     * @param id
     */
    public void delete(ID id){
        getDaoImpl().delete(id);
    }

    /**
     * 通过实例查询一批对象
     * @param ex
     * @return
     */
    @Override
    public List<T> findAll(Example<T> ex){

        List<T> all = getDaoImpl().findAll(ex);


        return all;
    }

    /**
     * 查询全部
     * @return
     */
    @Override
    public List<T> findAll(){
        return getDaoImpl().findAll();
    }

    /**
     * 带条件分页查询
     * @param specification
     * @return
     */
    @Override
    public List<T> findAll(Specification<T> specification){
        return getDaoImpl().findAll(specification);
    }

    /**
     * 获取DAO实现
     * @return
     */
    public abstract IBaseDao<T,ID> getDaoImpl();

}
